package com.zrfintech.manage.service;

import com.alibaba.fastjson.JSONObject;
import com.zrfintech.domain.MgMenu;
import com.zrfintech.domain.MgPageConfig;
import com.zrfintech.domain.MgPageConfigOption;
import com.zrfintech.domain.MgRolePageOptionPermission;
import com.zrfintech.manage.vo.request.PageConfigRequest;
import com.zrfintech.service.MgMenuRepo;
import com.zrfintech.service.MgPageConfigOptionRepo;
import com.zrfintech.service.MgPageConfigRepo;
import com.zrfintech.service.MgRolePageOptionPermissionRepo;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
public class MgPageConfigService {

    @Autowired
    private MgPageConfigRepo pageConfigRepo;

    @Autowired
    private MgPageConfigOptionRepo pageConfigOptionRepo;

    @Autowired
    private MgRolePageOptionPermissionRepo mgRolePageOptionPermissionRepo;

    @Autowired
    private MgMenuRepo mgMenuRepo;

    // todo 更新可能会有问题
    @Transactional(rollbackFor = Exception.class)
    public void upsert(PageConfigRequest pageConfig, List<MgPageConfigOption> pageOptionList, String menuCode, List<String> roleCodeList) {
        if (pageConfig.getId() == null) {
            pageConfigRepo.create(pageConfig);
        } else {
            MgPageConfig target = pageConfigRepo.getById(pageConfig.getId());
            target.setPageConfigJson(JSONObject.parseObject(pageConfig.getPageConfigJson()).toJSONString());
            target.setPageName(pageConfig.getPageName());
            pageConfigRepo.updateById(target);
        }
        if (StringUtils.isNotEmpty(menuCode)) {
            MgMenu mgMenu = mgMenuRepo.getByMenuCode(menuCode);
            if (mgMenu != null) {
                mgMenu.setPageCode(pageConfig.getPageCode());
                mgMenuRepo.updateById(mgMenu);
            }
        }
        if (CollectionUtils.isNotEmpty(roleCodeList) && CollectionUtils.isNotEmpty(pageOptionList)) {
            for (MgPageConfigOption pageConfigOption : pageOptionList) {
                for (String roleCode : roleCodeList) {
                    MgRolePageOptionPermission mgRolePageOptionPermission = new MgRolePageOptionPermission();
                    mgRolePageOptionPermission.setRoleCode(roleCode);
                    mgRolePageOptionPermission.setPageOptionCode(pageConfigOption.getOptionCode());
                    mgRolePageOptionPermissionRepo.create(mgRolePageOptionPermission);
                }
            }

        }
        if (CollectionUtils.isNotEmpty(pageOptionList)) {
            for (MgPageConfigOption pageConfigOption : pageOptionList) {
                pageConfigOption.setPageCode(pageConfig.getPageCode());
                pageConfigOptionRepo.create(pageConfigOption);
            }
        }
    }
}
